from flask import render_template

from common.exception.exception import BusiException
from common.log.logging import log
from common.models.responses import not_found, internal_error, busi_error
from common.routes.routes import api_bp
from common.server.app_instance import app  # 导入全局的 app 实例
from common.utils.config_reader import get_config


# 主页路由
@app.route('/')
def index():
    """
    渲染主页模板。

    返回:
    - 渲染后的 'index.html' 页面
    """
    return render_template('index.html')


# 通用异常处理
@app.errorhandler(404)
def handle_404(e):
    """
    处理404 Not Found错误。

    参数:
    - e: 异常对象

    返回:
    - 404错误的JSON响应
    """
    return not_found(str(e))


@app.errorhandler(500)
def handle_500(e):
    """
    处理500 Internal Server Error。

    参数:
    - e: 异常对象

    返回:
    - 500错误的JSON响应
    """
    log.error(f"Internal Server Error: {e}")
    return internal_error(str(e))


@app.errorhandler(BusiException)
def handle_busi(e):
    """
        处理业务异常

        参数:
        - e: 异常对象

        返回:
        - 业务异常错误的JSON响应
        """
    log.error(f"Busi Error: {e}")
    return busi_error(e)


def print_routes(app):
    """
    打印所有注册的路由。
    """
    log.info("Url Mappings:")
    for rule in app.url_map.iter_rules():
        log.info(f"Path: {rule.rule}, Methods: {rule.methods}, Endpoint: {rule.endpoint}")


if __name__ == '__main__':
    # 获取项目根路径配置，默认api
    context_path = get_config('server.context-path', '/')
    # 注册蓝图
    app.register_blueprint(api_bp, url_prefix=context_path)

    # 打印所有路由
    print_routes(app)

    port = get_config('server.port', 5000)
    # 启动Flask应用，启用调试模式
    # Attension: 启用调试模式时，handle_500和handle_400不会被触发
    app.run(port=port, debug=False)